home *** CD-ROM | disk | FTP | other *** search
/ Developer Helper 1: Phil & Dave's Excellent CD / Excellent CD HFS.raw / Moof / Goodies / HyperCard Goodies / Serial Toolkit / Source Code / setSPortBufferSize.p < prev    next >
Text File  |  1988-11-18  |  3KB  |  92 lines

  1. (*
  2.     setSPortBufferSize sizeOfBuffer -- Free the old buffer (if any) and allocate a new on of the size given.
  3.         The buffer is permanently freed if the size is zero, or by calling closeSPort.
  4.  
  5.     Note: If this routine is called with a non-zero buffer size, it is imperative that closeSPort is
  6.     called or bufferSPort is called again with a zero buffer size, before exiting HyperCard. If this
  7.     is not done, the serial port driver will continue to dump characters into the buffer despite the
  8.     fact that the buffer and been deallocated as a part of the application heap deallocation. This
  9.     means the data will get written to "random" locations used by the Finder or the next application.
  10.     This, in turn, will cause strange and mysterious crashes.
  11.  
  12.     To compile and link this file using Macintosh Programmer's Workshop,
  13.  
  14.         pascal -w setSPortBufferSize.p
  15.         link -m ENTRYPOINT -o HyperCommands -rt XCMD=7034 -sn Main=setSPortBufferSize ∂
  16.             setSPortBufferSize.p.o "{MPW}"Libraries:interface.o
  17.  
  18.     © Copyright 1987,88 by Apple Computer, Inc.
  19.  
  20.     Initial coding 9/87 by Harry R. Chesley.
  21. *)
  22.  
  23. {$R-}
  24.  
  25. {$S setSPortBufferSize }     { Segment name must be the same as the command name. }
  26.  
  27. unit DummyUnit;
  28.  
  29. interface
  30.  
  31. uses MemTypes, QuickDraw, OSIntf, ToolIntf, HyperXCmd;
  32.  
  33. procedure EntryPoint(paramPtr: XCmdPtr);
  34.     
  35. implementation
  36.  
  37. type
  38.  
  39. Str31 = String[31];
  40.  
  41. procedure setSPortBufferSize(paramPtr: XCmdPtr); forward;
  42.  
  43. procedure EntryPoint(paramPtr: XCmdPtr);
  44.  
  45.     begin
  46.         setSPortBufferSize(paramPtr);
  47.     end;
  48.  
  49. procedure setSPortBufferSize(paramPtr: XCmdPtr);
  50.  
  51.     var newBufferSize: longInt;
  52.         newBufferPtr: Ptr;
  53.  
  54.     {$I XCmdGlue.inc}
  55.  
  56.     procedure Fail(errMsg: Str255); { set theResult and quit }
  57.         begin
  58.             paramPtr^.returnValue := PasToZero(errMsg);
  59.             exit(setSPortBufferSize);
  60.         end;
  61.  
  62.     {$I SPortUtil.inc}
  63.  
  64.     begin
  65.         if paramPtr^.paramCount <> 1 then Fail('parameter count is not 1');
  66.  
  67.         newBufferSize := GetLongParm(1);
  68.  
  69.         SetUpSPortGlobals;
  70.         EnsureOpenPort;
  71.  
  72.         { Check if we're to use the default buffer. }
  73.         if newBufferSize = 0 then newBufferPtr := nil
  74.         { If not, create the new buffer. }
  75.         else
  76.             begin
  77.                 newBufferPtr := NewPtr(newBufferSize);
  78.                 if newBufferPtr = nil then newBufferSize := 0;
  79.             end;
  80.         { Let the port know about the buffer. }
  81.         if SerSetBuf(ThisSPort.portInDev,newBufferPtr,newBufferSize) <> noErr then
  82.             begin
  83.                 DisposPtr(newBufferPtr);
  84.                 Fail('SetSerBuf failed');
  85.             end;
  86.         { If there was an old buffer, dispose of it. }
  87.         if ThisSPort.inputBuffer <> NIL then DisposPtr(ThisSPort.inputBuffer);
  88.         { Remember the new buffer's location. }
  89.         Globals^^.ports[Globals^^.selectedPort].inputBuffer := newBufferPtr;
  90.     end;
  91. end.
  92.